package com.zlsy.learning.leetcode.arraycorrelation.array665;

/**
 * @author zhouliang
 * @date 2020/5/28 8:32
 * 非递减数列： 对于数组中所有的 i (1 <= i < n)，总满足 array[i] <= array[i + 1]。
 */
public class CheckPossibility {

    /**
     * 一，当数组长度小于3时，最多需要调整一次就能满足条件
     * 二，当数组长度大于等于3时，出现前一个元素y大于后一个元素z时，
     * 如果y的前元素x不存在，让y=z即可；若x存在，会有以下情况
     * x    y   z
     * 1    3   2
     * 2    3   1
     * 3    3   1
     * 2    3   2
     * 要满足条件，需要如下调整：
     * 1，当x<z,让y=z
     * 2，当x>z,让z=y
     * 3, 当x=z,让y=z
     * 综合以上可以得到：当x存在且x>z，就让z=y，否则让y=z
     * 当变更超过2次就不再满足条件
     */
    public static boolean checkPossibility(int[] nums) {
        //如果数组长度小于3，最多需要调整一次就能满足条件，例如[1]、[1,2]
        if (nums.length < 3) {
            return true;
        }
        int count = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            if (nums[i] > nums[i + 1]) {
                count++;
                if (count > 1) {
                    break;
                }
                //y前面的元素x存在，
                if (i - 1 >= 0 && nums[i - 1] > nums[i + 1]) {
                    //z = y
                    nums[i + 1] = nums[i];
                } else {
                    //y前面的元素x不存在，y等于z即可
                    nums[i] = nums[i + 1];
                }
            }
        }
        return count <= 1;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{5, 2, 3};
        boolean b = checkPossibility(nums);
        System.out.println(b);
    }
}
